package com.iakuil.app.common.core.domain;

import com.fasterxml.jackson.annotation.JsonAnyGetter;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 动态字段
 *
 * <p>作用有二：
 * <ul>
 *   <li>参与JSON序列化，但不参与JSON反序列化（出于安全考虑）；
 *   <li>作为Map的替代，向DAO层传递查询参数。
 * </ul>
 * <p>注意：属性值尽量不要有嵌套。
 *
 * @author Kai
 */
public abstract class DynamicFields implements Serializable {

    public DynamicFields() {
    }

    /**
     * 动态属性
     *
     * <p>在某些API管理平台（比如：Apifox）又称之为<strong>额外字段</strong>（additionalProperties）。
     */
    protected Map<String, Object> props;

    /**
     * 序列化JSON/XML时，props属性内字段会被扁平化，与code、msg等处于同一层级。
     */
    @JsonAnyGetter
    public Map<String, Object> getProps() {
        return this.props;
    }

    /**
     * Adding Properties to an Instance.
     *
     * <p>如果需要隐式的从前端接收参数，可以添加{@link com.fasterxml.jackson.annotation.JsonAnySetter}注解。
     * <p>但是除非安全规范允许，不推荐这么做。
     */
    public DynamicFields put(String key, Object value) {
        if (this.props == null) {
            this.props = new LinkedHashMap<>();
        }
        this.props.put(key, value);
        return this;
    }
}
